#define TAXA_FITNESS 0.30
#define TAXA_CROSSOVER 0.50
#define TX_REPRODUCAO 0.2
#define NUM_SOLUCOES 100


typedef struct{
	RNET ** rnet;
	Rede ** confRede;
	int fitness;	
	int erros;
		
} Solucao;

struct node{
	Solucao sol;
	struct node * prox;
	struct node * ant;
};

typedef struct node Node;

typedef struct{
	Node * ini;
	Node * fim;
	int tam;
}SolutionList;


int calculaFitness (Solucao  sol);

Solucao * alocaSolucao(int num);

Solucao alocaSolucaoUnica();

void imprimeSolucao( Solucao * sol, int valSol);

Solucao atribuiDemandaLista(Lista *list, int ** qtdRotas, Solucao sol);

//void liberaSolutionList(SolutionList * lista);

Node * alocaNode(Solucao solution);

SolutionList * alocaSolutionList();

void insereSolutionListOrdenado(SolutionList * list, Node * novo);

void imprimeSolutionList(SolutionList * list);

void imprimeSolutionList2(SolutionList * list);

SolutionList * selecionaReprodutores(SolutionList * list);

int calculaRotaCross(RNET ** rnet, int ** qtdRotas, int i, int j, int *freq, int * contaRotaZero, int valorListaTaxada, Rede ** rotas0, Rede ** rotas1);

void removeNode(SolutionList * list);

Solucao alocaSolucaoCruzada(Lista *list, int ** qtdRotas, Rede ** rotas0, Rede ** rotas1);

//Solucao alocaSolucaoCruzada(Lista *list, int ** qtdRotas, Solucao sol0, Solucao sol1);

SolutionList * crossOver(SolutionList * listRep, Lista *list, int ** qtdRotas);

SolutionList * melhoresNovaGeracao(SolutionList * novaGeracao);

void mutacaoSolutionList(Lista * list, int ** qtdRotas, SolutionList * lista);

SolutionList * substituiPopulacao(SolutionList * velhaG, SolutionList * novaG);

